package m

import (
	"GameServer/Game/cache"
	"GameServer/Game/dbmodule"
	"GameServer/Game/errors"

	"github.com/globalsign/mgo/bson"
	log "github.com/sirupsen/logrus"
)

// 用户圣诞树
type UserChristmasTree struct {
	BaseM
	Uid bson.ObjectId `bson:"_id" json:"_id"` // 用户uid

	ActivId   int64 `bson:"activId" json:"activId"`     // 圣诞活动
	BeginTime int64 `bson:"beginTime" json:"beginTime"` // 活动开始时间
	EndTime   int64 `bson:"endTime" json:"endTime"`     // 活动结束时间

	Level    int64 `bson:"level" json:"level"` // 圣诞树当前等级
	MaxLevel int64 `bson:"maxLevel" json:"maxLevel"`
	Ball     int64 `bson:"ball" json:"ball"`         // 玩家拥有装饰球数量
	Candy    int64 `bson:"candy" json:"candy"`       // 玩家拥有拐棍糖数量
	Stocking int64 `bson:"stocking" json:"stocking"` // 玩家拥有圣诞袜数量

	Tree map[int64]*ChristmasTree `bson:"tree" json:"tree"` // 圣诞树等级信息
}

// 圣诞树
type ChristmasTree struct {
	Level    int64 `bson:"level" json:"level"`       // 圣诞树等级
	Ball     int64 `bson:"ball" json:"ball"`         // 装饰球
	Candy    int64 `bson:"candy" json:"candy"`       // 拐棍糖
	Stocking int64 `bson:"stocking" json:"stocking"` // 圣诞袜
	State    int64 `bson:"state" json:"state"`       // 0.未完成 1.完成 2.已领取
}

// 圣诞活动
type CActiv struct {
	BaseM
	Uid       int64 `bson:"_id" json:"_id"`
	ActivId   int64 `bson:"activId" json:"activId"`     // 圣诞活动
	BeginTime int64 `bson:"beginTime" json:"beginTime"` // 活动开始时间
	EndTime   int64 `bson:"endTime" json:"endTime"`     // 活动结束时间
}

func NewUserChristmasTree() cache.EntryI {
	return &UserChristmasTree{
		Tree: make(map[int64]*ChristmasTree),
	}
}

// 保存信息
func (this *UserChristmasTree) Save() (err error) {
	err = dbmodule.MgoDB.GameDB.Upsert("UserChristmasTree", bson.M{"_id": this.Uid}, this)
	if err != nil {
		return err
	}
	return
}

func (this *UserChristmasTree) Load(key interface{}) (err error) {
	switch key.(type) {
	case string:
		if key.(string) == "" {
			return errors.New("无效的key load, key empty")
		}
		this.Uid = bson.ObjectIdHex(key.(string))
	case bson.ObjectId:
		this.Uid = key.(bson.ObjectId)
	default:
		log.WithFields(log.Fields{
			"method": "UserChristmasTree_Load",
			"data":   key,
		}).Error("无效的key load")
		return errors.New("无效的key load")
	}
	return this.LoadData()
}

// 加载数据
func (this *UserChristmasTree) LoadData() (err error) {
	err = dbmodule.MgoDB.GameDB.FindOne("UserChristmasTree", bson.M{"_id": this.Uid}, nil, &this)
	if err != nil {
		if err.Error() == "not found" {
			return nil
		}
		return
	}
	return
}

// 更新数据
func (this *UserChristmasTree) Update(val *UserChristmasTree) {
	Cache.Put("UserChristmasTree", val.Uid.Hex(), val)
	val.UpdateData()
}

// 获取每日礼包信息
func GetUserChristmasTree(uid string) *UserChristmasTree {
	v, _ := Cache.Get("UserChristmasTree", uid)
	return v.(*UserChristmasTree)
}

// 圣诞活动：创建
func NewCActiv() cache.EntryI {
	return &CActiv{}
}

// 圣诞活动：保存信息
func (this *CActiv) Save() (err error) {
	err = dbmodule.MgoDB.GameDB.Upsert("CActiv", bson.M{"_id": this.Uid}, this)
	if err != nil {
		return
	}
	return
}

// 圣诞活动：加载
func (this *CActiv) Load(key interface{}) (err error) {
	switch key.(type) {
	case int64:
		this.Uid = key.(int64)
	default:
		log.WithFields(log.Fields{
			"method": "CActiv_Load",
			"data":   key,
		}).Error("无效的key load")
		return errors.New("无效的key load")
	}
	return this.LoadData()
}

// 圣诞活动：加载数据
func (this *CActiv) LoadData() (err error) {
	err = dbmodule.MgoDB.GameDB.FindOne("CActiv", bson.M{"_id": this.Uid}, nil, &this)
	if err != nil {
		if err.Error() == "not found" {
			return nil
		}
		return err
	}
	return
}

// 圣诞活动：更新数据
func (this *CActiv) Update(val *CActiv) {
	Cache.Put("CActiv", val.Uid, val)
	val.UpdateData()
}

// 圣诞活动：获取数据
func GetCActiv(uid int64) *CActiv {
	v, _ := Cache.Get("CActiv", uid)
	return v.(*CActiv)
}
